package com.jsejtman.gastos.persistence.dao;

import com.jsejtman.gastos.persistence.entity.Usuario;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

/**
 * Dal del usuario.
 * 
 * @author jsejtman
 * 
 */
public class UsuarioDao extends GenericDao<Usuario, Long> {

	/**
	 * Logger.
	 */
	private static Logger logger = Logger.getLogger(UsuarioDao.class);

	/**
	 * Lista los usuarios activos de forma ordenada.
	 * 
	 * @return la lista de usuarios.
	 * @throws DaoException en caso de problemas.
	 */
	@SuppressWarnings("unchecked")
	public final List<Usuario> listarUsuariosActivosOrdenados() throws DaoException {

		List<Usuario> lista = null;
		try {
			lista =
			        this.getSession().createCriteria(Usuario.class).addOrder(
			        // Order.desc(Usuario.PUEDE_LOGUEARSE)).addOrder(
			                Order.asc(Usuario.NOMBRE_USUARIO))
			                .add(Restrictions.eq(Usuario.BAJA_LOGICA, Boolean.FALSE)).list();
		} catch (final HibernateException ex) {
			UsuarioDao.logger.error("Error loading usuario", ex);
			throw new DaoException(ex);
		}
		return lista;
	}

	/**
	 * Lista los usuarios de forma ordenada.
	 * 
	 * @return la lista de usuarios.
	 * @throws DaoException en caso de problemas.
	 */
	@SuppressWarnings("unchecked")
	public final List<Usuario> listarUsuariosOrdenados() throws DaoException {

		List<Usuario> lista = null;
		try {
			lista = this.getSession().createCriteria(Usuario.class).addOrder(
			// Order.desc(Usuario.PUEDE_LOGUEARSE)).addOrder(
			        Order.asc(Usuario.NOMBRE_USUARIO)).list();
		} catch (final HibernateException ex) {
			UsuarioDao.logger.error("Error loading usuario", ex);
			throw new DaoException(ex);
		}
		return lista;
	}

	/**
	 * Obtiene un usuario por su nombreDeUsuario.
	 * 
	 * @param nombreDeUsuario el nombre de usuario
	 * @return el usuario.
	 * @throws DaoException en caso de problemas.
	 */
	public final Usuario getByNombreDeUsuario(final String nombreDeUsuario) throws DaoException {

		if (nombreDeUsuario == null) {
			throw new IllegalArgumentException("El parámetro nombreDeUsuario es requerido.");
		}
		try {
			final Criteria baseCriteria = this.getSession().createCriteria(Usuario.class);

//			final Criteria hpCriteria = baseCriteria.createCriteria("healthcareProvider");
//			hpCriteria.add(Restrictions.eq("NOMBRE_DE_USUARIO", nombreDeUsuario));
			baseCriteria.add(Restrictions.eq("NOMBRE_DE_USUARIO", nombreDeUsuario));

			return ((Usuario) baseCriteria.uniqueResult());

		} catch (final HibernateException e) {
			UsuarioDao.logger.error("Error loading usuario", e);
			throw new DaoException(e);
		}
	}
}
